/**
 * 绘制线形轨迹（多段折线）
 * @param {Object} viewer - Cesium Viewer 对象，用于在场景中添加实体。
 * @param {Array} positions - 经纬度数组，格式为 [lon1, lat1, lon2, lat2, ...]。
 * @param {String} color - 线条颜色，如 'RED'、'GREEN' 等。
 * @param {String} labelText - 标签说明文本。
 */
export function drawLine(viewer, positions, color, labelText) {
  const arrowSize = 10; // 箭头的大小

  // 循环遍历每一对经纬度，绘制折线
  for (let i = 0; i < positions.length - 2; i += 2) {
    viewer.entities.add({
      polyline: {
        // 将经纬度数组转换为 Cesium Cartesian3 坐标
        positions: Cesium.Cartesian3.fromDegreesArray([
          positions[i],
          positions[i + 1],
          positions[i + 2],
          positions[i + 3],
        ]),
        width: 5, // 线宽度
        material: new Cesium.PolylineArrowMaterialProperty(
          Cesium.Color[color.toUpperCase()] // 使用传入的颜色
        ),
        arrowSize: arrowSize, // 设置箭头大小
      },
      label: {
        text: labelText, // 标签文本
        font: "14pt sans-serif", // 字体样式
        fillColor: Cesium.Color.WHITE, // 字体颜色
        style: Cesium.LabelStyle.FILL_AND_OUTLINE, // 标签样式：填充并带有轮廓
        outlineWidth: 2, // 轮廓宽度
        verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // 标签垂直对齐方式
        pixelOffset: new Cesium.Cartesian2(0, -20), // 标签位置的像素偏移
      },
      position: Cesium.Cartesian3.fromDegrees(positions[0], positions[1]), // 标签位置设置在折线起点
    });
  }
}

/**
 * 绘制平行四边形轨迹
 * @param {Object} viewer - Cesium Viewer 对象，用于在场景中添加实体。
 * @param {Array} positions - 四边形顶点的经纬度数组 [lon1, lat1, lon2, lat2, lon3, lat3, lon4, lat4]。
 * @param {String} color - 线条颜色，如 'BLUE'、'RED' 等。
 * @param {String} labelText - 标签说明文本。
 */
export function drawParallelogram(viewer, positions, color, labelText) {
  const arrowSize = 10; // 箭头的大小

  // 闭合平行四边形，添加起始点到数组末尾
  positions.push(positions[0], positions[1]);

  // 循环绘制平行四边形的边
  for (let i = 0; i < positions.length - 2; i += 2) {
    viewer.entities.add({
      polyline: {
        positions: Cesium.Cartesian3.fromDegreesArray([
          positions[i],
          positions[i + 1],
          positions[i + 2],
          positions[i + 3],
        ]),
        width: 5, // 线宽度
        material: new Cesium.PolylineArrowMaterialProperty(
          Cesium.Color[color.toUpperCase()] // 使用传入的颜色
        ),
        arrowSize: arrowSize, // 设置箭头大小
      },
      label: {
        text: labelText, // 标签文本
        font: "14pt sans-serif", // 字体样式
        fillColor: Cesium.Color.WHITE, // 标签颜色
        style: Cesium.LabelStyle.FILL_AND_OUTLINE, // 标签样式：填充并带有轮廓
        outlineWidth: 2, // 轮廓宽度
        verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // 标签垂直对齐方式
        pixelOffset: new Cesium.Cartesian2(0, -20), // 标签位置的像素偏移
      },
      position: Cesium.Cartesian3.fromDegrees(positions[0], positions[1]), // 标签位置设置在平行四边形的起点
    });
  }
}

/**
 * 绘制圆形轨迹
 * @param {Object} viewer - Cesium Viewer 对象，用于在场景中添加实体。
 * @param {Number} lon - 圆心经度。
 * @param {Number} lat - 圆心纬度。
 * @param {Number} radius - 圆形的半径（以米为单位）。
 * @param {String} color - 线条颜色，如 'GREEN'、'RED' 等。
 * @param {String} labelText - 标签说明文本。
 */
export function drawCircle(viewer, lon, lat, radius, color, labelText) {
  const numPoints = 100; // 圆的点数，用于模拟一个圆形
  const circlePositions = []; // 存储圆形轨迹的每个点

  // 计算圆上每个点的经纬度
  for (let i = 0; i < numPoints; i++) {
    const angle = (i / numPoints) * 2 * Math.PI;
    const offsetLon =
      (radius * Math.cos(angle)) /
      (111320 * Math.cos(Cesium.Math.toRadians(lat))); // 经度方向的调整
    const offsetLat = (radius * Math.sin(angle)) / 110574; // 纬度方向的调整
    const circleLon = lon + offsetLon;
    const circleLat = lat + offsetLat;
    circlePositions.push(circleLon, circleLat); // 存储计算出的点
  }

  // 闭合圆形，添加第一个点到最后
  circlePositions.push(circlePositions[0], circlePositions[1]);

  // 循环绘制圆的每条线段
  for (let i = 0; i < circlePositions.length - 2; i += 2) {
    viewer.entities.add({
      polyline: {
        positions: Cesium.Cartesian3.fromDegreesArray([
          circlePositions[i],
          circlePositions[i + 1],
          circlePositions[i + 2],
          circlePositions[i + 3],
        ]),
        width: 5, // 线宽度
        material: new Cesium.PolylineArrowMaterialProperty(
          Cesium.Color[color.toUpperCase()] // 使用传入的颜色
        ),
        arrowSize: 10, // 箭头大小
      },
      label: {
        text: labelText, // 标签文本
        font: "14pt sans-serif", // 字体样式
        fillColor: Cesium.Color.WHITE, // 标签颜色
        style: Cesium.LabelStyle.FILL_AND_OUTLINE, // 标签样式：填充并带有轮廓
        outlineWidth: 2, // 轮廓宽度
        verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // 标签垂直对齐方式
        pixelOffset: new Cesium.Cartesian2(0, -20), // 标签位置的像素偏移
      },
      position: Cesium.Cartesian3.fromDegrees(lon, lat), // 标签位置设置在圆心
    });
  }
}


/**
 * 绘制圆形区域（填充）
 * @param {Object} viewer - Cesium Viewer 对象，用于在场景中添加实体。
 * @param {Number} lon - 圆心经度。
 * @param {Number} lat - 圆心纬度。
 * @param {Number} radius - 圆形的半径（米）。
 * @param {String} color - 区域颜色（填充颜色），如 'BLUE'。
 * @param {Number} alpha - 透明度（0~1），用于设置填充透明度。
 */
export function drawCircleArea(viewer, lon, lat, radius, color, alpha = 0.5) {
  viewer.entities.add({
    position: Cesium.Cartesian3.fromDegrees(lon, lat),
    ellipse: {
      semiMajorAxis: radius, // 半径
      semiMinorAxis: radius, // 半径
      material: Cesium.Color[color.toUpperCase()].withAlpha(alpha), // 填充颜色和透明度
      outline: true, // 是否显示轮廓
      outlineColor: Cesium.Color[color.toUpperCase()], // 轮廓颜色
      outlineWidth: 2 // 轮廓线宽
    }
  });
}


/**
 * 绘制平行四边形区域（填充）
 * @param {Object} viewer - Cesium Viewer 对象，用于在场景中添加实体。
 * @param {Array} positions - 平行四边形的顶点经纬度数组 [lon1, lat1, lon2, lat2, lon3, lat3, lon4, lat4]。
 * @param {String} color - 区域填充颜色，如 'RED'。
 * @param {Number} alpha - 透明度（0~1），用于设置填充透明度。
 */
export function drawParallelogramArea(viewer, positions, color, alpha = 0.5) {
  viewer.entities.add({
    polygon: {
      hierarchy: Cesium.Cartesian3.fromDegreesArray(positions), // 顶点数组
      material: Cesium.Color[color.toUpperCase()].withAlpha(alpha), // 填充颜色和透明度
      outline: true, // 是否显示轮廓
      outlineColor: Cesium.Color[color.toUpperCase()], // 轮廓颜色
      outlineWidth: 2 // 轮廓线宽
    }
  });
}


/**
 * 绘制正方形区域（填充）
 * @param {Object} viewer - Cesium Viewer 对象，用于在场景中添加实体。
 * @param {Number} lon - 正方形中心的经度。
 * @param {Number} lat - 正方形中心的纬度。
 * @param {Number} sideLength - 正方形边长（米）。
 * @param {String} color - 填充颜色，如 'GREEN'。
 * @param {Number} alpha - 透明度（0~1），用于设置填充透明度。
 */
export function drawSquareArea(viewer, lon, lat, sideLength, color, alpha = 0.5) {
  const halfSide = sideLength / 2; // 正方形边长的一半

  // 计算正方形四个顶点的经纬度
  const nw = Cesium.Cartesian3.fromDegrees(lon - halfSide / 111320, lat + halfSide / 110574); // 左上角
  const ne = Cesium.Cartesian3.fromDegrees(lon + halfSide / 111320, lat + halfSide / 110574); // 右上角
  const se = Cesium.Cartesian3.fromDegrees(lon + halfSide / 111320, lat - halfSide / 110574); // 右下角
  const sw = Cesium.Cartesian3.fromDegrees(lon - halfSide / 111320, lat - halfSide / 110574); // 左下角

  viewer.entities.add({
    polygon: {
      hierarchy: new Cesium.PolygonHierarchy([nw, ne, se, sw]), // 四个顶点构成的正方形区域
      material: Cesium.Color[color.toUpperCase()].withAlpha(alpha), // 填充颜色和透明度
      outline: true, // 是否显示轮廓
      outlineColor: Cesium.Color[color.toUpperCase()], // 轮廓颜色
      outlineWidth: 2 // 轮廓线宽
    }
  });
}


/**
 * 绘制三维轨迹管道（模拟飞行路径）
 * @param {Object} viewer - Cesium Viewer 对象，用于在场景中添加实体。
 * @param {Array} positions - 飞行路径点的数组 [lon1, lat1, alt1, lon2, lat2, alt2, ...]。
 * @param {Number} radius - 管道的半径（米）。
 * @param {String} color - 管道的颜色，如 'YELLOW'。
 */
export function draw3DPipelineTrack(viewer, positions, radius = 100, color = 'YELLOW') {
  const cartesianPositions = [];
  for (let i = 0; i < positions.length; i += 3) {
    // 将经纬度和高度转换为 Cartesian3 坐标
    const position = Cesium.Cartesian3.fromDegrees(positions[i], positions[i + 1], positions[i + 2]);
    cartesianPositions.push(position);
  }

  // 添加实体，绘制管道
  viewer.entities.add({
    polylineVolume: {
      positions: cartesianPositions, // 轨迹的三维点
      shape: computeCircle(radius), // 轨迹的横截面形状（圆形）
      material: Cesium.Color[color.toUpperCase()].withAlpha(0.8), // 管道颜色
      outline: true, // 是否显示轮廓
      outlineColor: Cesium.Color[color.toUpperCase()], // 轮廓颜色
      outlineWidth: 1 // 轮廓线宽
    }
  });
}

/**
 * 生成圆形管道的截面
 * @param {Number} radius - 管道的半径
 * @returns {Array} 圆形的点数组，用于生成圆形截面
 */
function computeCircle(radius) {
  const positions = [];
  const sides = 360; // 360 个点来表示圆的截面
  for (let i = 0; i < sides; i++) {
    const radians = (i * Math.PI * 2) / sides;
    positions.push(new Cesium.Cartesian2(Math.cos(radians) * radius, Math.sin(radians) * radius));
  }
  return positions;
}
